from django.http import HttpResponse, JsonResponse
from django.shortcuts import render, redirect
from django.views import View

from book.models import BookInfo


# Create your views here.
def create_book(request):
    book = BookInfo.objects.create(
        name='linux',
        pub_date='1996-7-26',
        readcount=10,
    )
    return HttpResponse("create")


def shop(request, city_id, mobile):  # 和路由的参数名称要一致
    print(city_id, mobile)
    query_params = request.GET
    # query_params具有字典的特性，也支持一对多
    print(query_params)
    order = query_params.getlist('order')
    print(order)
    return HttpResponse('shop test')


'''
查询字符串
http://ip:port/path/?key1=value1&key2=value2
以？分为两部分，
第一部:request path
第二部分 : 查询字符串 字典集
'''


def register(request):
    data = request.POST
    print(data)
    return HttpResponse('ok')


def json(request):
    body = request.body
    print(body.decode())  # 需要解码
    '''
    {
    "name":"张三",
    "age":10
    }
    '''
    print(type(body.decode()))  # <class 'str'>
    # json类型的字符串可以转换为dict
    import json
    body_dict = json.loads(body.decode())
    print(body_dict)  # {'name': '张三', 'age': 10}
    # 请求头
    print(request.META)
    return HttpResponse("json ok")


def method(request):
    print(request.method)
    return HttpResponse(request.method)


def response(request):
    info = {
        'name': '张三',
        'gender': '男',
    }
    # data返回的响应数据，一般是字典类型
    girl_list = [
        {
            'name': 'bob',
            'address': 'beijing',
        },
        {
            'name': 'lin',
            'address': 'shanghai',
        }
    ]
    # res = JsonResponse(data=girl_list) 会出现格式错误
    # res = JsonResponse(data=girl_list,safe=False)
    # safe=True 表示data是字典数据
    # JsonResponse 可以把字典转换为json
    # 现在给了一非字典数据，意思就是出了问题，自己解决。
    # json.loads将json字符串转换为str
    # json.dump 将字典转换为json字符串
    # res['name'] = 'python3'

    import json
    data = json.dumps(girl_list)
    res = HttpResponse(data)
    return redirect('https://www.baidu.com')


'''
响应状态码：
1xx 消息
2xx 200 
3xx 重定向
4xx 请求出错
# 404 路由 403 权限
5xx 服务器错误
'''
'''
此一次请求，携带查询字符串
http://127.0.0.1:8000/set_cookie/?username=bob&passwd=123
服务器接收到请求后，获取username服务器设置cookie信息 cookie信息包含 username
浏览器接收到服务器响应后，把cookie保存下来
第二次访问请求：我们访问127.0.0.1 都会携带cookie的信息，服务器可以读取cookie信息，来判断用户身份
'''


def set_cookie(request):
    # 获取查询字符串
    username = request.GET.get('username')
    password = request.GET.get('password')
    print(username)
    # 服务器设置cookie信息
    response = HttpResponse('set_cookie')
    # cookie的使用
    # key value=
    # max_age 是一个计时器，从响应开始 计数的一个秒数
    response.set_cookie('name', username, max_age=60 * 20)
    response.set_cookie('pwd', password)
    # 删除cookie
    response.delete_cookie('name')
    return response


def get_cookie(request):
    print(request.COOKIES)
    name = request.COOKIES.get('name')
    return HttpResponse(name)


# =======================session==================
# session保存在服务器 -- 数据相对安全
# session 依赖于 cookie

'''
第一次请求 会在服务器端设置session信息
服务器会生成一个session的cookie信息
浏览器接收到信息后，会把cookie数据保存起来

第二次之后的请求，就会写带这个sessionid ,服务器会验证这个sessionid，验证没有问题的相关数据，实现业务
'''


def set_session(request):
    # 模拟获取用户信息
    username = request.GET.get('username')
    # 设置session信息
    user_id = 1
    request.session['user_id'] = user_id
    request.session['user_name'] = username
    # clear 删除session中的数据，但是key保留
    # request.session.clear()
    # flush 删除所有的数据，包括key
    # request.session.flush()
    # 设置session有效期，单位s
    request.session.set_expiry()
    return HttpResponse('set_session')


def get_session(request):
    user_id = request.session['user_id']
    user_name = request.session['user_name']
    content = '{},{}'.format(user_id, user_name)
    return HttpResponse(content)


class LoginView(View):
    def get(self, request):
        return HttpResponse('GET')

    def post(self, request):
        return HttpResponse('POST')


from django.contrib.auth.mixins import LoginRequiredMixin


class OrderView(LoginRequiredMixin, View):
    def get(self, request):
        return HttpResponse('GET方法')

    def post(self, request):
        return HttpResponse('POST方法')
